home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CMNCTRL.PAK / MLISTCTL.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  166 lines

  1. // MyListCtrl.cpp : implementation file
  2. //
  3.  
  4. // This is a part of the Microsoft Foundation Classes C++ library.
  5. // Copyright (C) 1992-1995 Microsoft Corporation
  6. // All rights reserved.
  7. //
  8. // This source code is only intended as a supplement to the
  9. // Microsoft Foundation Classes Reference and related
  10. // electronic documentation provided with the library.
  11. // See these sources for detailed information regarding the
  12. // Microsoft Foundation Classes product.
  13.  
  14. #include "stdafx.h"
  15. #include "ctrldemo.h"
  16. #include "mlistctl.h"
  17. #include "listcpg.h"
  18.  
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CMyListCtrl
  27.  
  28. CMyListCtrl::CMyListCtrl()
  29. {
  30.     m_bDragging = FALSE;
  31.     m_pimageListDrag = NULL;
  32. }
  33.  
  34. CMyListCtrl::~CMyListCtrl()
  35. {
  36. }
  37.  
  38.  
  39. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
  40.     //{{AFX_MSG_MAP(CMyListCtrl)
  41.     ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
  42.     ON_NOTIFY_REFLECT(LVN_BEGINRDRAG, OnBeginDrag)
  43.     ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
  44.     ON_WM_MOUSEMOVE()
  45.     ON_WM_LBUTTONUP()
  46.     ON_WM_RBUTTONUP()
  47.  
  48.     //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50.  
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CMyListCtrl message handlers
  53. void CMyListCtrl::OnBeginDrag(LPNMHDR pnmhdr, LRESULT *pResult)
  54. {
  55.     CPoint            ptItem, ptAction, ptImage;
  56.     NM_LISTVIEW        *pnmListView = (NM_LISTVIEW *)pnmhdr;
  57.  
  58.     ((CListCtrlPage *)GetParent())->ShowNotification(pnmhdr, pResult);
  59.     ASSERT(!m_bDragging);
  60.     m_bDragging = TRUE;
  61.     m_iItemDrag = pnmListView->iItem;
  62.     ptAction = pnmListView->ptAction;
  63.     GetItemPosition(m_iItemDrag, &ptItem);  // ptItem is relative to (0,0) and not the view origin
  64.     GetOrigin(&m_ptOrigin);
  65.     m_pimageListDrag = CreateDragImage(m_iItemDrag, &ptImage);
  66.     m_sizeDelta = ptAction - ptImage;   // difference between cursor pos and image pos
  67.     m_ptHotSpot = ptAction - ptItem + m_ptOrigin;  // calculate hotspot for the cursor
  68.     m_pimageListDrag->DragShowNolock(TRUE);  // lock updates and show drag image
  69.     m_pimageListDrag->SetDragCursorImage(0, m_ptHotSpot);  // define the hot spot for the new cursor image
  70.     m_pimageListDrag->BeginDrag(0, CPoint(0, 0));
  71.     ptAction -= m_sizeDelta;
  72.     m_pimageListDrag->DragEnter(this, ptAction);
  73.     m_pimageListDrag->DragMove(ptAction);  // move image to overlap original icon
  74.     SetCapture();
  75. }
  76.  
  77. void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
  78. {
  79.     long        lStyle;
  80.     int            iItem;
  81.     LV_ITEM        lvitem;
  82.  
  83.     lStyle = GetWindowLong(m_hWnd, GWL_STYLE);
  84.     lStyle &= LVS_TYPEMASK;  // drag will do different things in list and report mode
  85.     if (m_bDragging)
  86.     {
  87.         m_pimageListDrag->DragMove(point - m_sizeDelta);  // move the image
  88.         if ((iItem = HitTest(point)) != -1)
  89.         {
  90.             m_iItemDrop = iItem;
  91.             m_pimageListDrag->DragLeave(this); // unlock the window and hide drag image
  92.             if (lStyle == LVS_REPORT || lStyle == LVS_LIST)
  93.             {
  94.                 lvitem.iItem = iItem;
  95.                 lvitem.iSubItem = 0;
  96.                 lvitem.mask = LVIF_STATE;
  97.                 lvitem.stateMask = LVIS_DROPHILITED;  // highlight the drop target
  98.                 SetItem(&lvitem);
  99.             }
  100.  
  101.             point -= m_sizeDelta;
  102.             m_pimageListDrag->DragEnter(this, point);  // lock updates and show drag image
  103.         }
  104.     }
  105.  
  106.     CListCtrl::OnMouseMove(nFlags, point);
  107. }
  108.  
  109.  
  110. void CMyListCtrl::OnButtonUp(CPoint point)
  111. {
  112.     if (m_bDragging)  // end of the drag operation
  113.     {
  114.         long        lStyle;
  115.         CString        cstr;
  116.  
  117.         lStyle = GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK; 
  118.         m_bDragging = FALSE;
  119.         m_pimageListDrag->DragLeave(this);
  120.         m_pimageListDrag->EndDrag();
  121.         if (lStyle == LVS_REPORT && m_iItemDrop != m_iItemDrag)  
  122.         {
  123.             cstr = GetItemText(m_iItemDrag, 0);
  124.             SetItemText(m_iItemDrop, 1, cstr);  // drop subitem text is dragged main item text
  125.         }
  126.         
  127.         if (lStyle == LVS_LIST && m_iItemDrop != m_iItemDrag)  //add ** to the drop item text
  128.         {
  129.             cstr = GetItemText(m_iItemDrop, 0);
  130.             cstr += _T("**");
  131.             SetItemText(m_iItemDrop, 0, cstr);
  132.         }
  133.     
  134.         if (lStyle == LVS_ICON || lStyle == LVS_SMALLICON)  // move the icon
  135.         {
  136.             point -= m_ptHotSpot;  // the icon should be drawn exactly where the image is
  137.             point += m_ptOrigin;
  138.             SetItemPosition(m_iItemDrag, point);  // just move the dragged item
  139.         }
  140.  
  141.         ::ReleaseCapture();
  142.     }
  143. }
  144.  
  145. void CMyListCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  146. {
  147.     OnButtonUp(point);
  148.     CListCtrl::OnLButtonUp(nFlags, point);
  149. }
  150.  
  151. void CMyListCtrl::OnRButtonUp(UINT nFlags, CPoint point)
  152. {
  153.     OnButtonUp(point);
  154.     CListCtrl::OnRButtonUp(nFlags, point);
  155. }
  156.  
  157. void CMyListCtrl::OnEndLabelEdit(LPNMHDR pnmhdr, LRESULT *pLResult)
  158. {
  159.     LV_DISPINFO  *plvDispInfo = (LV_DISPINFO *)pnmhdr;
  160.      LV_ITEM         *plvItem = &plvDispInfo->item;
  161.  
  162.     ((CListCtrlPage *)GetParent())->ShowNotification(pnmhdr, pLResult);
  163.     if (plvItem->pszText != NULL)
  164.         SetItemText(plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
  165. }
  166.